package com.ia.aistream.manager.framework.redis;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 字符串常用命令封装开始
 *
 * @author chenjunsheng
 */
public interface RedisStringManager {
    /**
     * SET 命令。
     *
     * @param key   键
     * @param value 值
     */
    void set(String key, Object value);

    /**
     * SET 命令。
     *
     * @param key   键
     * @param value 值
     * @param time
     * @param unit
     */
    void set(String key, Object value, long time, TimeUnit unit);

    /**
     * <b>SETNX:</b>
     * 只在键 key 不存在的情况下， 将键 key 的值设置为 value 。
     * <p>
     * 若键 key 已经存在， 则 SETNX 命令不做任何动作。
     * <p>
     * SETNX 是『SET if Not eXists』(如果不存在，则 SET)的简写。
     *
     * @param key
     * @param value
     * @return
     */
    Boolean setnx(String key, Object value);

    /**
     * 参考 SETEX 命令。
     *
     * @param key     键
     * @param seconds 失效时间，单位：秒
     * @param value   键
     */
    void setex(String key, int seconds, Object value);

    /**
     * 这个命令和 SETEX 命令相似， 但它以毫秒为单位设置 key 的生存时间， 而不是像 SETEX 命令那样以秒为单位进行设置。
     *
     * @param key
     * @param milliseconds
     * @param value
     */
    void psetex(String key, long milliseconds, Object value);

    /**
     * 参考 GET 命令。
     *
     * @param key 键
     * @return 如果键 key 不存在，那么返回特殊值 nil；否则，返回键 key 的值。如果键 key 的值并非字符串类型，那么返回一个错误，因为 GET 命令只能用于字符串值。
     */
    <T> T get(String key, Class<T> clazz);

    /**
     * GETSET key value
     * 将键 key 的值设为 value ， 并返回键 key 在被设置之前的旧值。
     *
     * @param key
     * @param value
     * @return
     */
    <T> T getSet(String key, T value);

    /**
     * STRLEN 命令返回字符串值的长度。
     * <p>
     * 当键 key 不存在时， 命令返回 0 。
     * <p>
     * 当 key 储存的不是字符串值时， 返回一个错误。
     *
     * @param key
     * @return
     */
    Long strLen(String key);

    /**
     * 为键 key 储存的数字值加上一。
     *
     * @param key
     * @return
     */
    Long incr(String key);

    /**
     * INCRBY key increment
     * <p>
     * 为键 key 储存的数字值加上增量 increment 。
     *
     * @param key
     * @param increment
     */
    void incrby(String key, long increment);

    /**
     * 为键 key 储存的值加上浮点数增量 increment 。
     *
     * @param key
     * @param increment
     */
    void incrbyfloat(String key, double increment);

    /**
     * 参考 MGET 命令。
     *
     * @param keys 键列表
     * @return 值列表，列表中包含了所有给定键的值。
     */
    <T> List<T> mget(Collection<String> keys, Class<T> clazz);

}
